package language_basic

import (
	"fmt"
	"strconv"
)

/*
判断
*/
func If() {
	var a int = 10

	if a > 9 {
		fmt.Println(strconv.Itoa(a) + "大于9")
	}

	if a < 11 {
		fmt.Println(strconv.Itoa(a) + "小于11")
	} else {
		fmt.Println(strconv.Itoa(a) + "大于11")
	}

	if a < 5 {
		fmt.Println(strconv.Itoa(a) + "小于5")
	} else if a < 8 {
		fmt.Println(strconv.Itoa(a) + "小于8")
	} else {
		fmt.Println(strconv.Itoa(a) + "大于5 大于8")
	}
}

//条件判断语句里面允许声明一个变量，这个变量的作用域只能在该条件逻辑块内，其他地方就不起作用了
//if判断的变体 num的定义在if里，那么只能够在该if..else语句块中使用，否则编译器会报错的。
func If2() {
	if num := 10; num%2 == 0 { //checks if number is even
		fmt.Println(num, "is even")
	} else {
		fmt.Println(num, "is odd")
	}
}

func Swtich() {
	/* 定义局部变量 */
	var grade string = "B"
	var marks int = 90

	switch marks {
	case 90:
		grade = "A"
	case 80:
		grade = "B"
	case 50, 60, 70:
		grade = "C" //case 后可以由多个数值
	default:
		grade = "D"
	}

	switch {
	case grade == "A":
		fmt.Printf("优秀!\n")
	case grade == "B", grade == "C":
		fmt.Printf("良好\n")
	case grade == "D":
		fmt.Printf("及格\n")
	case grade == "F":
		fmt.Printf("不及格\n")
	default:
		fmt.Printf("差\n")
	}
	fmt.Printf("你的等级是 %s\n", grade)
}

//如需贯通后续的case，就添加fallthrough fallthrough应该是某个case的最后一行。如果它出现在中间的某个地方，编译器就会抛出错误。

func TypeSwitch(x interface{}) {
	switch i := x.(type) {
	case nil:
		fmt.Printf(" x 的类型 :%T", i)
	case int:
		fmt.Printf("x 是 int 型")
	case float64:
		fmt.Printf("x 是 float64 型")
	case func(int) float64:
		fmt.Printf("x 是 func(int) 型")
	case bool, string:
		fmt.Printf("x 是 bool 或 string 型")
	default:
		fmt.Printf("未知型")
	}
}

//循环 for是唯一的循环语句

/*
for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环
for key, value := range oldMap {
    newMap[key] = value
}
break 打断，跳出整个循环
continue 跳出本次循环 继续下一次循环
goto 可以无条件地转移到过程中指定的行
*/
func For() {
	for i := 1; i <= 4; i++ {
		fmt.Println(i)
	}
	var arr = [6]int{8, 2, 2, 3}
	for k, v := range arr {
		fmt.Println(k, v)
	}

	var a int = 3

	/* 循环 */
LOOP:
	for a < 7 {
		if a == 5 {
			/* 跳过迭代 */
			a = a + 1
			goto LOOP
		}
		fmt.Printf("a的值为 : %d\n", a)
		a++
	}
}

func TestFor() {
	//无线循环
	sum := 0
	for {
		sum++
		if sum > 100 {
			break
		}
	}

	fmt.Println(sum)

	strings := []string{"google", "runoob"}
	for i, s := range strings {
		fmt.Println(i, s)
	}

	numbers := [6]int{1, 2, 3, 5}
	for i, x := range numbers {
		fmt.Printf("第 %d 位 x 的值 = %d\n", i, x)
	}
}

/*
goto的使用
统一错误处理
多处错误处理存在代码重复时是非常棘手的，例如：
err := firstCheckError()
if err != nil {
goto onExit
}
err = secondCheckError()
if err != nil {
goto onExit
}
fmt.Println("done")
return
onExit:
fmt.Println(err)
exitProcess()
*/
